#ifndef _FACE_API_H_
#define _FACE_API_H_

#include "face_board.h"

#if (_SAFETY_MODULE_TYPE_ == _FACE_SAFETY_MODULE_) && (_SAFETY_VERIFYFUNCTION_ENABLE_)

/* 描述各字段长度 */
// 描述帧头字段长度
#define FACE_SYNCWORD_BIT_LENGTH                    (2ul)
// 描述报文类型字段长度
#define FACE_MESSAGE_ID_BIT_LENGTH                  (1ul)
// 描述报文数据长度
#define FACE_DATA_LENGTH_BIT_LENGTH                 (2ul)
// 描述数据校验码长度
#define FACE_CHECK_CODE_BIT_LENGTH                  (1ul)
// 描述响应码字段长度
#define FACE_RESPONSE_COMMAND_BIT_LENGTH            (1ul)
// 描述结果码字段长度
#define FACE_RESULT_BIT_LENGTH                      (1ul)
// 描述附带数据字段长度
#define FACE_ATTACHED_DATA_LENGTH                   (FACE_MAX_OF_EIGENVALUE_FILE_SIZE)

// 消息开头固定同步字
#define FACE_SYNCWORD_H_BYTE                         0xEF
#define FACE_SYNCWORD_L_BYTE                         0xAA

// 模组序列号长度
#define FACE_MODULE_SN_LENGTH                        (33ul)
// 模组软件版本号长度
#define FACE_LENGTH_OF_VERSION_INFORMATION           (33ul)
// 人脸库版本号
#define FACE_LENGTH_OF_LIBRARY_VERSION               (21ul)

// 最大用户姓名长度
#define FACE_MAX_USER_NAME_LENGTH                    (32ul)
// 最大加密密钥长度
#define FACE_ENCRYPTION_KEY_LENGTH                   (16ul)
// 文件请求长度
#define FACE_MAX_FILE_REQUEST_SIZE                   (200ul)
// 最大用户注册人数
#define FACE_NUMBER_OF_REGISTERED_USERS              (50ul)

// 虚拟用户编码
#define FACE_VIRTUAL_USER                             0xFFFF

/**
 * @brief 报文验证码
 *
 */
typedef enum FaceMsgVerifyCodeClass
{
  PACKET_VERIFY_SUCCESS            = 0x00, // 验证成功
  PACKET_SYNCODE_ERROR             = 0xE0, // 同步码出错
  PACKET_CHECK_ERROR               = 0xE1, // 校验出错
  PACKET_UNKNOWN_CMD               = 0xE2, // 未知命令
} FaceMsgVerifyCode_t;

/**
 * @brief 报文类型
 *
 */
typedef enum
{
  FACE_MESSAGE_REPLY               = 0x00, // 主控命令的应答
  FACE_MESSAGE_NOTE                = 0x01, // 模块主动发给主控的信息
  FACE_MESSAGE_IMAGE               = 0x02, // 模块给主控传送图片、文件
} FaceMessageId_t;

/**
 * @brief 报文控制命令集
 *
 */
typedef enum
{
#if (_FACE_MODULE_TYPE_ == _AIVA_FACE_MODEL_)
  FACE_API_RESET_CMD               = 0x10, // 停止所有在处理的消息，模块进入standby 状态
  FACE_API_GET_STATUS_CMD          = 0x11, // 立刻返回模块当前状态
  FACE_API_VERIFY_CMD              = 0x12, // 鉴权解锁
  FACE_API_ENROLL_CMD              = 0x13, // 交互式录入用户
  FACE_API_CAPTURE_CMD             = 0x14, // 获取最近录入或者识别时候抓拍的图片大小
  FACE_API_SNAP_IMAGE_CMD          = 0x16, // 抓拍图片并存储到本地
  FACE_API_GET_SAVED_IMAGE_CMD     = 0x17, // 设置本次传输图片的编码
  FACE_API_UOLOAD_IMAGE_CMD        = 0x18, // 将本地存储的图片上传到主控
  FACE_API_ENROLL_SINGLE_CMD       = 0x1D, // 通过单张人脸注册用户
  FACE_API_DEL_USER_CMD            = 0x20, // 删除一个注册用户
  FACE_API_DEL_ALL_CMD             = 0x21, // 删除所有注册用户
  FACE_API_GET_USER_INFO_CMD       = 0x22, // 获得某个注册用户信息
  FACE_API_FACE_RESET_CMD          = 0x23, // 重置算法状态，如正在精选交互式录入，会清空已录入的方向
  FACE_API_GET_ALL_USER_ID_CMD     = 0x24, // 获取所有已注册用户的数量和 ID
  FACE_API_ENROLL_ITG_CMD          = 0x26, // 集成支持并扩展所有录入方式
  FACE_API_GET_VERSION_CMD         = 0x30, // 获得软件版本信息
  FACE_API_GET_SN_CMD              = 0x35, // 获得模组设备 SN
  FACE_API_START_OTA_CMD           = 0x40, // 进入 OTA 升级模式
  FACE_API_STOP_OTA_CMD            = 0x41, // 退出 OTA 模式，模组重启
  FACE_API_GET_OTA_STATUS_CMD      = 0x42, // 获取 OTA 状态以及传输升级包的起始包序号
  FACE_API_OTA_HEADER_CMD          = 0x43, // 发送升级包的大小、总包数、分包大小、升级包的 md5 值
  FACE_API_OTA_PACKET_CMD          = 0x44, // 发送升级包，包括包序号、包大小、包数据
  FACE_API_INIT_ENCRYPTION_CMD     = 0x50, // 设置加密随机数
  FACE_API_CONFIG_BAUDRATE_CMD     = 0x51, // OTA 模式下设定通信口波特率
  FACE_API_SET_RELEASE_ENC_KEY_CMD = 0x52, // 设定量产加密秘钥序列，掉电会保存
  FACE_API_SET_DEBUG_ENC_KEY_CMD   = 0x53, // 设定调试加密秘钥序列，掉电丢失
  FACE_API_GET_LOG_FILE_CMD        = 0x60, // 保持 log 到内存中
  FACE_API_UPLOAD_LOGFILE_CMD      = 0x61, // 将保持的 log 上传到主控
  FACE_API_TRANS_FILE_PACKET_CMD   = 0x90, // 向模块发送文件数据
  FACE_API_ENROLL_FROM_IMAGE_CMD   = 0x91, // 通过图片注册用户
  FACE_API_GET_FEATURE_INFO_CMD    = 0x92, // 获取用户特征信息
  FACE_API_ENROLL_WITH_FEATURE_CMD = 0x94, // 通过特征注册用户
  FACE_API_UPLOAD_FEATURE_CMD      = 0x96, // 上传特征数据
  FACE_API_CAPTURE_PIC_TYPE_CMD    = 0x9A, // 设置抓拍图片类型
  FACE_API_MX_GET_ALL_USERID_CMD   = 0x9B, // 获取所有已注册用户的数量
  FACE_API_SET_THRESHOLD_LEVEL_CMD = 0xD4, // 设置算法安全等级
  FACE_API_POWER_DOWN_CMD          = 0xED, // 模块准备关机，结束当前在处理的任务，清除文件系统缓存
  FACE_API_GET_ALGORITHM_VERSION   = 0xF3, // 获取算法版本号
  FACE_API_DEMO_MODE_CMD           = 0xFE, // 进入演示模式

#elif (_FACE_MODULE_TYPE_ == _SENSETIME_FACE_MODEL_)
  FACE_API_HARDWARE_SELF_TEST_CMD  = 0x0F, // 硬件自检
  FACE_API_RESET_CMD               = 0x10, // 停止所有在处理的消息，模块进入standby 状态
  FACE_API_GET_STATUS_CMD          = 0x11, // 立刻返回模块当前状态
  FACE_API_VERIFY_CMD              = 0x12, // 鉴权解锁

  FACE_API_SNAP_IMAGE_CMD          = 0x16, // 抓拍图片并存储到本地
  FACE_API_GET_SAVED_IMAGE_CMD     = 0x17, // 设置本次传输图片的编码
  FACE_API_UOLOAD_IMAGE_CMD        = 0x18, // 将本地存储的图片上传到主控
  FACE_FEATURE_ENROLL_SINGLE_CMD   = 0x19, // 通过单张人脸注册用户
  FACE_API_ENROLL_SINGLE_CMD       = 0x1D, // 通过单张人脸注册用户
  FACE_API_ENROLL_RGB_CMD          = 0x1E, // 通过 RGB 图片注册用户

  FACE_API_DEL_USER_CMD            = 0x20, // 删除一个注册用户
  FACE_API_DEL_ALL_CMD             = 0x21, // 删除所有注册用户
  FACE_API_GET_USER_INFO_CMD       = 0x22, // 获得某个注册用户信息
  FACE_API_GET_ALL_USER_ID_CMD     = 0x24, // 获取所有已注册用户的数量和 ID
  FACE_API_GET_VERSION_CMD         = 0x30, // 获得软件版本信息

  FACE_API_GET_OTA_STATUS_CMD      = 0x42, // 获取 OTA 状态以及传输升级包的起始包序号
  FACE_API_OTA_HEADER_CMD          = 0x43, // 发送升级包的大小、总包数、分包大小、升级包的 md5 值
  FACE_API_OTA_PACKET_CMD          = 0x44, // 发送升级包，包括包序号、包大小、包数据

  FACE_API_INIT_ENCRYPTION_CMD     = 0x50, // 设置加密随机数
  FACE_API_CONFIG_BAUDRATE_CMD     = 0x51, // OTA 模式下设定通信口波特率
  FACE_API_SET_RELEASE_ENC_KEY_CMD = 0x52, // 设定量产加密秘钥序列，掉电会保存
  FACE_API_SET_DEBUG_ENC_KEY_CMD   = 0x53, // 设定调试加密秘钥序列，掉电丢失


  FACE_API_GET_LOG_FILE_CMD        = 0x60, // 保持 log 到内存中
  FACE_API_UPLOAD_LOGFILE_CMD      = 0x61, // 将保持的 log 上传到主控

  FACE_API_SET_RGBIMAGE_SIZE_CMD   = 0x88, // 设置 RGB 图像大小
  FACE_API_TRANSFER_RGB_IMAGE_CMD  = 0x89, // 传输 RGB 图像

  FACE_API_SET_THRESHOLD_LEVEL_CMD = 0xD4, // 设置算法安全等级
  FACE_API_MISC_AI_CONFIG_CMD      = 0xD8, // 设置 AI 配置
  FACE_API_POWER_DOWN_CMD          = 0xED, // 模块准备关机，结束当前在处理的任务，清除文件系统缓存

  FACE_API_ENABLE_DEBUG_MODE_CMD   = 0xF0, // 使能 debug 模式
  FACE_API_GET_DEBUG_INFO_CMD      = 0xF1, // 获取 debug 信息
  FACE_API_UPLOAD_DEBUG_INFO_CMD   = 0xF2, // 上传 debug 信息
  FACE_API_GET_LIBRARY_VERSION     = 0xF3, // 获取当前解锁库版本信息
  FACE_API_DEMO_MODE_CMD           = 0xFE, // 进入演示模式
#endif
} FaceMessageCommand_t;

/**
 * @brief 定义模组解析报文结果
 *
 */
typedef enum FaceReplyResultClass
{
  MR_SUCCESS                        = 0x00, // 成功
  MR_REJECTED                       = 0x01, // 模块拒绝该命令
  MR_ABORTED                        = 0x02, // 录入/解锁算法已终止
  MR_FAILED4_FACE                   = 0x04, // 相机打开失败
  MR_FAILED4_UNKNOWNREASON          = 0x05, // 未知错误
  MR_FAILED4_INVALIDPARAM           = 0x06, // 无效的参数
  MR_FAILED4_NOMEMORY               = 0x07, // 内存不足
  MR_FAILED4_UNKNOWNUSER            = 0x08, // 没有已录入的用户
  MR_FAILED4_MAXUSER                = 0x09, // 录入超过最大用户数量
  MR_FAILED4_FACE_ENROLLED          = 0x0A, // 人脸已录入
  MR_FAILED4_LIVENESSCHECK          = 0x0C, // 活体检测失败
  MR_FAILED4_TIMEOUT                = 0x0D, // 录入或解锁超时
  MR_FAILED4_AUTHORIZATION          = 0x0E, // 加密芯片授权失败
  MR_FAILED4_READ_FILE              = 0x13, // 读文件失败
  MR_FAILED4_WRITE_FILE             = 0x14, // 写文件失败
  MR_FAILED4_NO_ENCRYPT             = 0x15, // 通信协议未加密
  MR_RGB_IMAGE_NOT_READY            = 0x17, // RGB图像没有就绪
  MR_INVALID_MESSAGE_ID             = 0xFD, // 无效信息ID,KEY未写入
  MR_DETECTION_ERROR                = 0xFE, // 检测错误
  MR_CODING_ERROR                   = 0xFF, // 编码错误
} FaceReplyResult_t;

/**
 * @brief 人脸当前的状态
 *
 */
typedef enum FaceCurrentStateClass
{
  FACE_STATE_NORMAL                         = 0x00, // 人脸正常
  FACE_STATE_NO_FACE                        = 0x01, // 未检测到人脸
  FACE_STATE_TOOUP                          = 0x02, // 人脸太靠近图片上边沿，未能录入
  FACE_STATE_TOODOWN                        = 0x03, // 人脸太靠近图片下边沿，未能录入
  FACE_STATE_TOOLEFT                        = 0x04, // 人脸太靠近图片左边沿，未能录入
  FACE_STATE_TOORIGHT                       = 0x05, // 人脸太靠近图片右边沿，未能录入
  FACE_STATE_FAR                            = 0x06, // 人脸距离太远，未能录入
  FACE_STATE_CLOSE                          = 0x07, // 人脸距离太近，未能录入
  FACE_STATE_EYEBROW_OCCLUSION              = 0x08, // 眉毛遮挡
  FACE_STATE_EYE_OCCLUSION                  = 0x09, // 眼睛遮挡
  FACE_STATE_FACE_OCCLUSION                 = 0x0A, // 脸部遮挡
  FACE_STATE_DIRECTION_ERROR                = 0x0B, // 录入人脸方向错误
  FACE_STATE_EYE_CLOSE_STATUS_OPEN_EYE      = 0x0C, // 在闭眼模式检测到睁眼状态
  FACE_STATE_EYE_CLOSE_STATUS               = 0x0D, // 闭眼状态
  FACE_STATE_EYE_CLOSE_STATUS_UNKOWN_STATUS = 0x0E, // 在闭眼模式检测中无法判定睁眼状态
} FaceCurrentState_t;

/**
 * @brief NOTE 消息NID类型
 *
 */
typedef enum FaceNoteNidCmdClass
{
  NID_READY        = 0x00, // 模块已准备好
  NID_FACE_STATE   = 0x01, // 算法执行成功
  NID_UNKNOWNERROR = 0x02, // 未知错误
  NID_OTA_DONE     = 0x03, // OTA 升级完毕
  NID_EYE_STATE    = 0x04, // 解锁过程中睁闭眼状态
} FaceNoteNidCmd_t;

/**
 * @brief 解锁过程中睁闭眼状态
 *
 */
typedef enum EyeStateClass
{
  DETECTED_OPEN_EYS         = 0x0C, // 闭眼模式下检测到睁眼状态
  KEEP_EYS_CLOSE_ONE_SECOND = 0x0D, // 持续一秒均闭眼状态
  UNCONFIRMABLE_STATE       = 0x0E, // 无法确认的状态
} EyeState_t;

/**
 * @brief OTA 升级状态
 *
 */
typedef enum NoteOTAStateClass
{
  OTA_SUCCESS = 0x00, // OTA更新成功
  OTA_FAIL    = 0x01, // OTA失败
} NoteOTAState_t;

/**
 * @brief 定义模组当前状态
 *
 */
typedef enum FaceModuleStateClass
{
  MODULE_IDLE     = 0x00, // 模块处于空闲状态，等待主控命令
  MODULE_BUSY     = 0x01, // 模块处于工作状态
  MODULE_ERROR    = 0x02, // 模块出错，不能正常工作
  MODULE_INVALID  = 0x03, // 模块未进行初始化
} FaceModuleState_t;

/**
 * @brief 定义人脸方向
 *
 */
typedef enum FaceDirectionClass
{
  FACE_DIRECTION_UNDEFINE = 0x00, // 未定义，默认为正向
  FACE_DIRECTION_MIDDLE   = 0x01, // 录入正向的人脸
  FACE_DIRECTION_RIGHT    = 0x02, // 录入朝右的人脸
  FACE_DIRECTION_LEFT     = 0x04, // 录入朝左的人脸
  FACE_DIRECTION_DOWN     = 0x08, // 录入朝下的人脸
  FACE_DIRECTION_UP       = 0x10, // 录入朝上的人脸
} FaceDirection_t;

/**
 * @brief 代表开锁时的睁闭眼状态
 *
 */
typedef enum FaceUnlockStateClass
{
  FACE_UNLOCK_NORMAL          = 200, // 睁眼
  FACE_UNLOCK_WITH_EYES_CLOSE = 204, // 闭眼
} FaceUnlockState_t;

/**
 * @brief 定义模组串口通信波特率
 *
 */
typedef enum FaceBaudRateClass
{
  FACE_UART_BAUDRATE_115200  = 0x01, // 115200波特率
  FACE_UART_BAUDRATE_230400  = 0x02, // 230400波特率
  FACE_UART_BAUDRATE_460800  = 0x03, // 460800波特率
  FACE_UART_BAUDRATE_1500000 = 0x04, // 1500000波特率
} FaceBaudRate_t;

/**
 * @brief 定义日志类型
 *
 */
typedef enum FaceLogTypeClass
{
  KERNEL_LOG = 0x00, // 内核日志
  APP_LOG    = 0x01, // 应用程序日志
} FaceLogType_t;

/**
 * @brief 定义抓拍图片类型
 *
 */
typedef enum CaptureTypeClass
{
  CAPTURE_IR_PICTURE  = 0x00, // IR图像
  CAPTURE_RGB_PICTURE = 0x01, // RGB图像
} CaptureType_t;

/**
 * @brief 图像压缩比例
 *
 */
typedef enum ImageCompressionQualityClass
{
  COMPRESS_30_PERCENT = 0x06, // 压缩30%
  COMPRESS_50_PERCENT = 0x08, // 压缩50%
  COMPRESS_80_PERCENT = 0x0B, // 压缩80%
} ImageCompressionQuality_t;

/**
 * @brief 报文字段内容
 *
 */
typedef struct
{
  uint8_t SyncCode[FACE_SYNCWORD_BIT_LENGTH];      // 同步码
  uint8_t MessageId;                               // 消息ID
  uint8_t DataLenght[FACE_DATA_LENGTH_BIT_LENGTH]; // 附带数据长度
  uint8_t Data[FACE_ATTACHED_DATA_LENGTH];         // 附带数据
} FaceProtocolFormat_t;

/**
 * @brief 响应数据字段格式
 *
 */
typedef struct
{
  uint8_t Command;                         // 命令
  uint8_t Result;                          // 执行结果
  uint8_t Data[FACE_ATTACHED_DATA_LENGTH]; // 附带数据
} FaceReplyProtocolFormat_t;

/**
 * @brief 通知消息字段格式
 *
 */
typedef struct
{
  uint8_t NoteMessageId;                   // 通知事件类型
  uint8_t Data[FACE_ATTACHED_DATA_LENGTH]; // 附带数据
} FaceNoteProtocolFormat_t;

/**
 * @brief 图像数据字段格式
 *
 */
typedef struct
{
  uint8_t ImageData[FACE_ATTACHED_DATA_LENGTH]; // 附带数据
} FaceImageProtocolFormat_t;

#if (_FACE_MODULE_TYPE_ == _AIVA_FACE_MODEL_)
/**
 * @brief 校验数据完整性
 *
 * @param pMessageIn  - 指向待校验数据地址的指针变量
 * @param DataSize    - 数据有效长度
 * @retval uint8_t    - 校验字
 */
extern uint8_t FaceParityCheck(uint8_t *pMessageIn, uint16_t DataSize);

/**
 * @brief 软复位
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildSoftwareResetMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 获取模组当前状态
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetModuleStatusMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 启动人脸验证
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Timeout     - 解锁超时时间(1-255秒，默认为10秒)
 * @return bool        - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildStartVerifyMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t Timeout);

/**
 * @brief 启动新用户注册
 *
 * @param pMessageOut  - 指向待发送数据地址的指针变量
 * @param pSizeOut     - 数据有效长度
 * @param Admin        - 管理员(yes:true  no:false)
 * @param pUserNameIn  - 录入用户姓名
 * @param Timeout      - 录取超时时间(1-255秒，默认为10秒)
 * @param Direction    - 录入的方向(详情请参考 FaceDirection_t)
 * @return bool        - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildStartNewUserRegistrationMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, bool Admin, uint8_t *pUserNameIn, uint8_t Timeout, uint8_t Direction);

/**
 * @brief 获取最近录入或者识别时候抓拍的图片大小
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetPictureSizeMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 启动人脸捉拍
 *
 * @param pMessageOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut       - 数据有效长度
 * @param Counts         - 抓拍图片的数量
 * @param StartNumber    - 抓拍图片的起始编号（1-30）
 * @return bool          - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildCapturePictureMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t Counts, uint8_t StartNumber);

/**
 * @brief 获取待上传图片大小
 *
 * @param pMessageOut      - 指向待发送数据地址的指针变量
 * @param pSizeOut         - 数据有效长度
 * @param NumberOfPictures - 待传输图片的编号（1-30）
 * @return bool            - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetCapturedPicturesMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t NumberOfPictures);

/**
 * @brief 上传人脸图片
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param ImageOffset - 待上传图片的偏移量
 * @param ImageSize   - 此次上传图片的大小，最大4000Bytes
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildUploadImageMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t ImageOffset, uint32_t ImageSize);

/**
 * @brief 删除特定的用户ID
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param UserId      - 用户ID
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildExampleDeleteSpecifiedUserMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t UserId);

/**
 * @brief 删除所有用户
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildDeleteAllUserMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 获得某个注册用户信息
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param UserId      - 用户编码
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetUserInformationMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t UserId);

/**
 * @brief 重置算法状态
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildResetAlgorithmStateMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 获取所有已注册用户的数量和 ID
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetAllUserIdMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 集成支持并扩展所有录入方式
 *
 * @param pMessageOut     - 指向待发送数据地址的指针变量
 * @param pSizeOut        - 数据有效长度
 * @param Admin           - 管理员(yes:true  no:false)
 * @param pUserNameIn     - 录入用户姓名
 * @param EnrollType      - 录入方式(0:交互式录入  1:单张录入)
 * @param EnableDuplicate - 用户重复录入(yes:true  no:false)
 * @param Timeout         - 录取超时时间(1-255秒，默认为10秒)
 * @param Direction       - 录入的方向(详情请参考 FaceDirection_t)
 * @return bool           - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildEnrollItgMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, bool Admin, uint8_t *pUserNameIn, bool EnrollType, bool EnableDuplicate, uint8_t TimeOut, uint8_t Direction);

/**
 * @brief 获取模组软件版本号
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetModuleVersionMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 获取模组序列号
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetModuleSnMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 设置加密随机数
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Random      - 随机数
 * @param Mode        - 加密模式
 * @param CurrentTime - 当前时区秒数
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildInitEncryptioMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t Random, uint8_t Mode, uint32_t CurrentTime);

/**
 * @brief 配置 OTA 模式下设定通信口波特率
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param BaudRate    - 通信口波特率等级
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildConfigUartBandrateMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t BaudRate);

/**
 * @brief 设定量产加密秘钥序列
 *
 * @param pMessageOut     - 指向待发送数据地址的指针变量
 * @param pSizeOut        - 数据有效长度
 * @param pEncryptioKeyIn - 加密秘钥序列
 * @return bool           - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildSetReleaseEncryptioKeyMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t *pEncryptioKeyIn);

/**
 * @brief 设定调试加密秘钥序列
 *
 * @param pMessageOut     - 指向待发送数据地址的指针变量
 * @param pSizeOut        - 数据有效长度
 * @param pEncryptioKeyIn - 加密秘钥序列
 * @return bool           - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildSetDebugReleaseEncryptioKeyMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t *pEncryptioKeyIn);

/**
 * @brief 设置算法安全等级
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Liveness    - 辨真度
 * @param Verify      - 安全阈值
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildSetThresholdLevelMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t Liveness, uint8_t Verify);

/**
 * @brief 模块准备关机
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildModulePowerDownMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 进入演示模式
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildIntoDemoModeMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 向模块发送文件数据
 *
 * @param pMessageOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut      - 数据有效长度
 * @param SizeOfFile    - 文件大小
 * @param Offset        - 本包数据偏移值
 * @param SizeOfPacket  - 本包数据大小
 * @param pPacketFileIn - 附带数据
 * @return bool         - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildTransFilePacketMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t SizeOfFile, uint32_t Offset, uint16_t SizeOfPacket, uint8_t *pPacketFileIn);

/**
 * @brief 通过图片注册用户
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Admin       - 管理员(yes:true  no:false)
 * @param pUserNameIn - 录入用户姓名
 * @param ImageType   - 图片类型(0:RGB图录入 1:IR图录入)
 * @param Timeout     - 录取超时时间(1-255秒，默认为10秒)
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildEnrollFromImageMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, bool Admin, uint8_t *pUserNameIn, bool ImageType, uint8_t Timeout);

/**
 * @brief 获取用户特征信息
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param UserId      - 用户编码
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetFeatureInformatizationMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t UserId);

/**
 * @brief 上传特征数据
 *
 * @param pMessageOut   - 指向待发送数据地址的指针变量
 * @param pSizeOut      - 数据有效长度
 * @param FeatureOffset - 上传数据的偏移值
 * @param SizeOfFeature - 上传数据的大小
 * @return bool         - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildUploadFeatureDataMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t FeatureOffset, uint32_t SizeOfFeature);

/**
 * @brief 通过特征注册用户
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Admin       - 管理员(yes:true  no:false)
 * @param pUserNameIn - 录入用户姓名
 * @param Direction   - 录入的方向(详情请参考 FaceDirection_t)
 * @param Timeout     - 录取超时时间(1-255秒，默认为10秒)
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildEnrollFromFeatureMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, bool Admin, uint8_t *pUserNameIn, uint8_t Direction, uint8_t Timeout);

/**
 * @brief 设置抓拍图片类型
 *
 * @param pMessageOut   - 指向待发送数据地址的指针变量
 * @param pSizeOut      - 数据有效长度
 * @param Width         - 图片宽度
 * @param Height        - 图片高度
 * @param CaptureType   - 图片类型(0:RGB图录入 1:IR图录入)
 * @param CompressRatio - 压缩比率(30%:0x06  50%:0x08  80%:0x0B)
 * @param CutoutFace    - 是否裁剪出人脸
 * @return bool         - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildCapturePictureTypeMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t Width, uint16_t Height, bool CaptureType, uint8_t CompressRatio, bool CutoutFace);

/**
 * @brief 获取所有已注册用户的数量
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetsNumberOfAllRegisteredUsersMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 通过单张人脸注册用户
 *
 * @param pMessageOut  - 指向待发送数据地址的指针变量
 * @param pSizeOut     - 数据有效长度
 * @param Admin        - 管理员(yes:true  no:false)
 * @param pUserNameIn  - 录入用户姓名
 * @param Timeout      - 录取超时时间(1-255秒，默认为10秒)
 * @param Direction    - 录入的方向(详情请参考 FaceDirection_t)
 * @return bool        - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildEnrollSingleMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, bool Admin, uint8_t *pUserNameIn, uint8_t Timeout, uint8_t Direction);

/**
 * @brief 构建获取算法版本报文
 *
 * @param pMessageOut  - 指向待发送数据地址的指针变量
 * @param pSizeOut     - 数据有效长度
 * @return bool        - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetAlgorithmVersion(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 解析通知命令
 * 
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pEventTypeOut - 事件类型
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceParesNotificationsMessage(const uint8_t *pMessageIn, uint8_t *pEventTypeOut);

/**
 * @brief 解析软复位应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplySoftwareResetMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析模组状态应答
 *
 * @param pMessageIn       - 指向应答报文数据起始位地址的指针变量
 * @param pCurrentStateOut - 模组当前状态
 * @return bool            - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetModuleStatusMessage(const uint8_t *pMessageIn, uint8_t *pCurrentStateOut);

/**
 * @brief 解析用户鉴权状态应答
 *
 * @param pMessageIn      - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut      - 用户编码
 * @param pUserNameOut    - 用户姓名
 * @param pAdminOut       - 是否为管理员
 * @param pUnlockStateOut - 解锁过程中睁闭眼状态
 * @return bool           - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyVerifyMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pUserNameOut, uint8_t *pAdminOut, uint8_t *pUnlockStateOut);

/**
 * @brief 解析启动新用户注册状态应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut    - 已注册用户的 ID
 * @param pDirectionOut - 各个方向人脸的录入状态
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyStartNewUserRegistrationMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pDirectionOut);

/**
 * @brief 解析返回最近录入或者识别时候抓拍的图片大小应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pImageSizeOut - 实际图片大小
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyCaptureMessage(const uint8_t *pMessageIn, uint32_t *pImageSizeOut);

/**
 * @brief 解析启动人脸捉拍应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplySnapImageMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获取待上传图片大小应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pImageSizeOut - 待上传图片大小
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetSavedImageMessage(const uint8_t *pMessageIn, uint32_t *pImageSizeOut);

/**
 * @brief 解析将本地存储的图片上传到主控应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pImageOffset  - 待上传的原图文件偏移量
 * @param pImageSizeOut - 上传图片大小
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyUploadImageMessage(const uint8_t *pMessageIn, uint32_t *pImageOffset, uint32_t *pImageSizeOut);

/**
 * @brief 解析删除特定用户应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyExampleDeleteSpecifiedUserMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析删除所有用户应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyDeleteAllUserMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获得注册用户信息应答
 *
 * @param pMessageIn   - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut   - 用户编码
 * @param pUserNameOut - 用户名称
 * @param pAdmin       - 管理员(yes:true  no:false)
 * @return bool        - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetUserInformationMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pUserNameOut, uint8_t *pAdmin);

/**
 * @brief 解析重置录取状态报文
 *
 * @param pMessageIn   - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyResetAlgorithmStateMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获取所有用户编码应答
 *
 * @param pMessageIn       - 指向应答报文数据起始位地址的指针变量
 * @param pNumberOfUserOut - 总用户数量
 * @param pUserIdOut       - 注册用户编码
 * @return bool            - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetAllUserIdMessage(const uint8_t *pMessageIn, uint8_t *pNumberOfUserOut, uint16_t *pUserIdOut);

/**
 * @brief 解析集成支持并扩展所有录入方式应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut    - 已注册用户的 ID
 * @param pDirectionOut - 各个方向人脸的录入状态
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyEnrollItgMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pDirectionOut);

/**
 * @brief 解析获取模组版本信息应答
 *
 * @param pMessageIn  - 指向应答报文数据起始位地址的指针变量
 * @param pVersionOut - 模组版本号
 * @return bool       - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetModuleVersionMessage(const uint8_t *pMessageIn, uint8_t *pVersionOut);

/**
 * @brief 解析获取模组序列号应答
 *
 * @param pMessageIn   - 指向应答报文数据起始位地址的指针变量
 * @param pSnNumberOut - 模组序列号
 * @return bool        - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetModuleSnMessage(const uint8_t *pMessageIn, char *pSnNumberOut);

/**
 * @brief 解析设置加密随机数应答
 *
 * @param pMessageIn   - 指向应答报文数据起始位地址的指针变量
 * @param pDeviceIdOut - 设备ID信息
 * @return bool        - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyInitEncryptioMessage(const uint8_t *pMessageIn, uint8_t *pDeviceIdOut);

/**
 * @brief 解析配置 OTA 模式下设定通信口波特率应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyConfigUartBandrateMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设定量产加密秘钥序列应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplySetReleaseEncryptioKeyMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设定调试加密秘钥序列应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplySetDebugEncryptioKeyMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析向模块发送文件数据应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyTransFilePacketMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析通过图片注册用户应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut    - 已注册用户的 ID
 * @param pDirectionOut - 各个方向人脸的录入状态
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyEnrollFromImageMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pDirectionOut);

/**
 * @brief 解析获取用户特征信息应答
 *
 * @param pMessageIn        - 指向应答报文数据起始位地址的指针变量
 * @param pSizeOfFeatureOut - 特征数据的长度信息
 * @return bool             - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetFeatureInformatizationMessage(const uint8_t *pMessageIn, uint32_t *pSizeOfFeatureOut);

/**
 * @brief 解析上传特征数据应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyUploadFeatureDataMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析通过特征注册用户应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut    - 已注册用户的 ID
 * @param pDirectionOut - 各个方向人脸的录入状态
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyEnrollFromFeatureMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pDirectionOut);

/**
 * @brief 解析设置抓拍图片类型应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyCapturePictureTypeMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获取所有已注册用户的数量应答
 *
 * @param pMessageIn       - 指向应答报文数据起始位地址的指针变量
 * @param pNumberOfUserOut - 已注册用户数量
 * @return bool            - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetsNumberOfAllRegisteredUsersMessage(const uint8_t *pMessageIn, uint16_t *pNumberOfUserOut);

/**
 * @brief 解析通过单张人脸注册用户应答
 *
 * @param pMessageIn    - 指向应答报文数据起始位地址的指针变量
 * @param pUserIdOut    - 已注册用户的 ID
 * @param pDirectionOut - 各个方向人脸的录入状态
 * @return bool         - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyEnrollSingleMessage(const uint8_t *pMessageIn, uint16_t *pUserIdOut, uint8_t *pDirectionOut);

/**
 * @brief 解析设置算法安全等级应答
 *
 * @return bool - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplySetThresholdLevelMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析模块准备关机应答
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyModulePowerDownMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析固件库版本号
 *
 * @param pMessageIn        - 指向应答报文数据起始位地址的指针变量
 * @param pLibaryVersionOut - 固件库版本号
 * @return bool             - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyGetAlgorithmVersionMessage(const uint8_t *pMessageIn, char *pLibaryVersionOut);

/**
 * @brief 解析进入掉电模式报文
 *
 * @param pMessageIn - 指向应答报文数据起始位地址的指针变量
 * @return bool      - 解析状态(true:成功  false:失败)
 */
extern bool FaceReplyIntoDemoModeMessage(const uint8_t *pMessageIn);

#elif (_FACE_MODULE_TYPE_ == _SENSETIME_FACE_MODEL_)
#endif
/**
 * @brief 校验数据完整性
 *
 * @param pMessageIn  - 指向待校验数据地址的指针变量
 * @param DataSize    - 数据有效长度
 * @retval uint8_t    - 校验字
 */
extern uint8_t FaceParityCheck(uint8_t *pMessageIn, uint16_t DataSize);

/**
 * @brief 软复位
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildSoftwareResetMessage(uint8_t *pMessageOut, uint16_t *pSizeOut);

/**
 * @brief 启动人脸验证
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param Timeout     - 解锁超时时间(1-255秒，默认为10秒)
 * @return bool        - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildStartVerifyMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t Timeout);

/**
 * @brief 启动人脸捉拍
 *
 * @param pMessageOut    - 指向待发送数据地址的指针变量
 * @param pSizeOut       - 数据有效长度
 * @param Counts         - 抓拍图片的数量
 * @param StartNumber    - 抓拍图片的起始编号（1-30）
 * @return bool          - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildCapturePictureMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t Counts, uint8_t StartNumber);

/**
 * @brief 获取待上传图片大小
 *
 * @param pMessageOut      - 指向待发送数据地址的指针变量
 * @param pSizeOut         - 数据有效长度
 * @param NumberOfPictures - 待传输图片的编号（1-30）
 * @return bool            - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildGetCapturedPicturesMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint8_t NumberOfPictures);

/**
 * @brief 上传人脸图片
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param ImageOffset - 待上传图片的偏移量
 * @param ImageSize   - 此次上传图片的大小，最大4000Bytes
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildUploadImageMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint32_t ImageOffset, uint32_t ImageSize);

/**
 * @brief 删除特定的用户ID
 *
 * @param pMessageOut - 指向待发送数据地址的指针变量
 * @param pSizeOut    - 数据有效长度
 * @param UserId      - 用户ID
 * @return bool       - 构建状态(true:成功  false:失败)
 */
extern bool FaceBuildExampleDeleteSpecifiedUserMessage(uint8_t *pMessageOut, uint16_t *pSizeOut, uint16_t UserId);


#endif
#endif
